(() => {
  function fn(a: any): any {
    return a;
  }
  /**
   * 在定义函数或是类时遇到类型不明确的  可以使用泛型
   *
   */
  function fn1<T>(a: T): T {
    //我不知道a到底是是么类型但是我知道 返回值和入参的类型时相同的
    return a;
  }
  fn1(10); //自动推断
  fn1<string>("test"); //类型断言

  function fn2<T, K>(a: T, b: K): T {
    console.log("b", b);
    return a;
  }
  fn2(123, "test");
  fn2<number, string>(333, "test");

  interface Test {
    length: number;
  }
  //泛型T得是Test的实现类(子类)
  function fn3<T extends Test>(a: T): number {
    return a.length;
  }
  fn3([1, 2, 2]); //传入的参数的类型得是Test接口的实现类
})();
